from IPython.display import HTML
HTML('''<script>
code_show=true;
function code_toggle() {
if (code_show){
$('div.input').hide();
} else {
$('div.input').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>''')
import pandas as pd
import numpy as np
The data is related with direct marketing campaigns of a Portuguese banking institution.
The marketing campaigns were based on phone calls. Often, more than one contact to the same client was required, in order to access if the product (bank term deposit) would be ('yes') or not ('no') subscribed.
To analyze based on different data points , whether the client would subscribe to Bank term to deposit
df = pd.read_csv('C:/Users/shrey/Downloads/bank-additional/bank-additional-full.csv',sep = ';')
bank data
1 - age (numeric)
2 - job : type of job (categorical: 'admin.','blue-collar','entrepreneur','housemaid','management','retired','self-employed','services','student','technician','unemployed','unknown')
3 - marital : marital status (categorical: 'divorced','married','single','unknown'; note: 'divorced' means divorced or widowed)
4 - education (categorical: 'basic.4y','basic.6y','basic.9y','high.school','illiterate','professional.course','university.degree','unknown')
5 - default: has credit in default? (categorical: 'no','yes','unknown')
6 - housing: has housing loan? (categorical: 'no','yes','unknown')
7 - loan: has personal loan? (categorical: 'no','yes','unknown')
related with the last contact of the current campaign:
8 - contact: contact communication type (categorical: 'cellular','telephone')
9 - month: last contact month of year (categorical: 'jan', 'feb', 'mar', ..., 'nov', 'dec')
10 - day_of_week: last contact day of the week (categorical: 'mon','tue','wed','thu','fri')
11 - duration: last contact duration, in seconds (numeric). Important note: this attribute highly affects the output target (e.g., if duration=0 then y='no'). Yet, the duration is not known before a call is performed. Also, after the end of the call y is obviously known. Thus, this input should only be included for benchmark purposes and should be discarded if the intention is to have a realistic predictive model.
other attributes:
12 - campaign: number of contacts performed during this campaign and for this client (numeric, includes last contact)
13 - pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric; 999 means client was not previously contacted)
14 - previous: number of contacts performed before this campaign and for this client (numeric)
15 - poutcome: outcome of the previous marketing campaign (categorical: 'failure','nonexistent','success')
social and economic context attributes
16 - emp.var.rate: employment variation rate - quarterly indicator (numeric)
17 - cons.price.idx: consumer price index - monthly indicator (numeric)
18 - cons.conf.idx: consumer confidence index - monthly indicator (numeric)
19 - euribor3m: euribor 3 month rate - daily indicator (numeric)
20 - nr.employed: number of employees - quarterly indicator (numeric)
Output variable (desired target):
21 - y - has the client subscribed a term deposit? (binary: 'yes','no')
df.shape
Our dataset contains 41,188 records and 21 attributes.
Here's how our dataset looks like
df.head()
We look at the statistical summary of all the variables present in our dataset
df.describe(include = 'all').T
We observe the following :-
Age has a range between 17 years and 98 years. With an average age of ~40.
There are people with 12 different types of job inour dataset with "admin" being the predominant category. This could be due to the fact that admin usually handles the company banking relatede matters.
Most of our customers have a university degree.
Most of our targeted users do not have a default.
Most of our targetd users have a housing loan however we can also see that most of our targets do not have a personal loan.
import plotly.express as px
Here we look at the age distribution of the targeted users.
df[['age']].describe().T
px.histogram(df , x = 'age')
We can see that age is right skewed and the average value of age from our targeted user is 40.
We can also observe most of our users are between the age 30 and 40.
We have 12 types of jobs. With admin being the repeated the maximum times
df[['job']].describe().T
px.histogram(df , x = 'job')
We can observer that most of our targeted users are either admin or blue-collar workers.
We've also observed targeting retired , unemployed and students , We would study the conversion rate.
We look at the distribution of Marital status
df[['marital']].describe().T
px.histogram(df , x = 'marital')
Most of our targeted users are either Married or Single.
We look at the distribution of education among our targeted users.
df[['education']].describe().T
px.histogram(df , x = 'education')
Most of our targeted users are either University degree holders or either High school degree holders. This also can represent the fact that we've many targeted users as Blue-collar workers.
We can also see Illitrate in our dataset. However there are only 18 such targeted users.
Here we look whether our targeted users are defaulters , or have a personal/housing loan.
df[['default','housing','loan']].describe().T
px.histogram(df , x='default')
px.histogram(df , x='housing')
px.histogram(df , x='loan')
We can see most of the people do not have a personal loan and Housing loan. We're also observing the most of our targeted customers are not defaulters
We create dummies for the following variables :-
df1 = pd.get_dummies(df , columns=['marital','job','education','poutcome'])
df1.head()
For other variables such as :-
We would create them manually based on our understanding
df1['default'] = np.where(df1['default'] == 'yes', 1, 0)
df1['housing'] = np.where(df1['housing'] == 'yes', 1, 0)
df1['loan'] = np.where(df1['loan'] == 'yes', 1, 0)
df1['contact'] = np.where(df1['contact'] == 'cellular', 1, 0)
df1.head()
df1['y'] = np.where(df1['y'] == 'yes',1 , 0)
import seaborn as sns
We look at the dataset from two variable perspective.
First , we look at correlations
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (15,15))
sns.heatmap(df1.corr(),cmap='coolwarm')
px.bar(df1 , x = 'y', y='age')